package material;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import commands.Command;

/**
 * Classe implementant l'interface Clock. Il s'agit de gerer l'execution de commandes dans le temps ce qui est fait, par delegation, par des objets CommandThrower.
 * L'objet ClockImpl se contente de "repertorier" les commandes lancees. 
 */
public class ClockImpl implements Clock {

	private Collection<CommandThrower> thrownCommands;		// "Repertoire" des commandes lancees
	
	public ClockImpl() {
		thrownCommands = new ArrayList<CommandThrower>();
	}
	
	@Override
	public void activateAfterTime(Command command, float time) {
		CommandThrower thrower = new CommandThrowerImpl();	// On cree un objet delegue thrower et on met en place son environnement 
		thrower.setCommand(command);
		thrower.setTime(time);
		thrownCommands.add(thrower);						// Une nouvelle commande va etre lancee, on l'ajoute donc au repertoire
		new Thread(thrower).start();						// Delegation de l'execution de la commande a l'objet thrower
	}

	@Override	
	public void activatePeriodically(Command command, float period) {
		CommandThrower thrower = new CommandThrowerImpl();	// On cree un objet delegue thrower et on met en place son environnement 
		thrower.setCommand(command);
		thrower.setTimer(period);
		thrownCommands.add(thrower);						// Une nouvelle commande va etre lancee, on l'ajoute donc au repertoire
		new Thread(thrower).start();						// Delegation de l'execution de la commande a l'objet thrower
	}

	@Override
	public void desactivate(Command command) {
		Iterator<CommandThrower> iterator = thrownCommands.iterator();
		boolean found = false;
		
		while(!found && iterator.hasNext()) {	// On cherche dans la collection des commandes lancees celle donnee en parametre
			CommandThrower currentThrower = iterator.next();
			if(command == currentThrower.getCommand()) {
				found = true;
				currentThrower.stopCommand();			// Si on trouve la commande correspondante, on la desactive
				thrownCommands.remove(currentThrower);	// et on l'enleve du repertoire
			}
		}
	}

}
